Code coverage report for src/ast.js

Statements: 49.16% (291 / 592)      Branches: 18.79% (31 / 165)      Functions: 43.94% (58 / 132)      Lines: 49.23% (286 / 581)      Ignored: none     

All files » src/ » ast.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 12111     1   16   116     1 3       3       3   3 9     3       1                                                 1 3   3 3                   1 43 23 20 20               1 23 15   15 3     15   8     23   1   1   1   1     1 1 58   58 58     1       1       1       1     1   1 1                 1   1                                   1       1     1   1 1                     1   1                         1                         1       1                                                             1     1   1 1                 1   1       1       1       1     1   1 1                   1   1       1       1                                                                 1     1   1 1 32   32   32 32     1   1 119     1 12     1       1 29   29           1     1   1 1 3   3   3 3 3     1   1 19 19     1 5   5         5     1       1 3   3         3 3 8       8           3           1     1   1 1 9   9   9 9 9     1   1 43 43 43     1 23 23 23     1       1 9   9     29     9           1     1   1 1 1   1   1 1     1   1 3 3     1       1                                                             1     1   1 1                   1   1           1       1                                                                       1     1   1 1                 1   1                   1       1                                                                       1     1   1 1                   1   1                                                                                                                                     1       1                                                       1     1   1 1                 1   1       1       1                                   1     1   1 1 1   1   1     1   1 7     1       1 1     1     1   1 1 9   9   9     1   1 29     1       1 9     1     1   1 1 1   1   1     1   1 5         5 15     5     1       1 1   1               1 3 3   3       3     1           1           1     1   1 1 2   2   2 2     1   1 4           4 8     4     1       1 2   2                 2 4   4       4     2           2           1     1   1 1           1                 1       1                               1                           1                                 1           1               1       1         1             1         1         1           1           1               1       1                                   1                                       1         1     1   1        
System.register(['./path-observer', './composite-observer', './access-keyed-observer'], function (_export) {
  'use strict';
 
  var PathObserver, CompositeObserver, AccessKeyedObserver, Expression, Chain, ValueConverter, Assign, Conditional, AccessScope, AccessMember, AccessKeyed, CallScope, CallMember, CallFunction, Binary, PrefixNot, LiteralPrimitive, LiteralString, LiteralArray, LiteralObject, Unparser, evalListCache;
 
  function _inherits(subClass, superClass) { Iif (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) subClass.__proto__ = superClass; }
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  /// Evaluate the [list] in context of the [scope].
  function evalList(scope, list, valueConverters) {
    var length = list.length,
        cacheLength,
        i;
 
    for (cacheLength = evalListCache.length; cacheLength <= length; ++cacheLength) {
      evalListCache.push([]);
    }
 
    var result = evalListCache[length];
 
    for (i = 0; i < length; ++i) {
      result[i] = list[i].evaluate(scope, valueConverters);
    }
 
    return result;
  }
 
  /// Add the two arguments with automatic type conversion.
  function autoConvertAdd(a, b) {
    if (a != null && b != null) {
      // TODO(deboer): Support others.
      if (typeof a == 'string' && typeof b != 'string') {
        return a + b.toString();
      }
 
      if (typeof a != 'string' && typeof b == 'string') {
        return a.toString() + b;
      }
 
      return a + b;
    }
 
    if (a != null) {
      return a;
    }
 
    if (b != null) {
      return b;
    }
 
    return 0;
  }
 
  function ensureFunctionFromMap(obj, name) {
    var func = obj[name];
 
    Eif (typeof func === 'function') {
      return func;
    }
 
    if (func === null) {
      throw new Error('Undefined function ' + name);
    } else {
      throw new Error('' + name + ' is not a function');
    }
  }
 
  function getKeyed(obj, key) {
    if (Array.isArray(obj)) {
      return obj[parseInt(key)];
    } else Eif (obj) {
      return obj[key];
    } else if (obj === null) {
      throw new Error('Accessing null object');
    } else {
      return obj[key];
    }
  }
 
  function setKeyed(obj, key, value) {
    if (Array.isArray(obj)) {
      var index = parseInt(key);
 
      if (obj.length <= index) {
        obj.length = index + 1;
      }
 
      obj[index] = value;
    } else {
      obj[key] = value;
    }
 
    return value;
  }
  return {
    setters: [function (_pathObserver) {
      PathObserver = _pathObserver.PathObserver;
    }, function (_compositeObserver) {
      CompositeObserver = _compositeObserver.CompositeObserver;
    }, function (_accessKeyedObserver) {
      AccessKeyedObserver = _accessKeyedObserver.AccessKeyedObserver;
    }],
    execute: function () {
      Expression = (function () {
        function Expression() {
          _classCallCheck(this, Expression);
 
          this.isChain = false;
          this.isAssignable = false;
        }
 
        Expression.prototype.evaluate = function evaluate() {
          throw new Error('Cannot evaluate ' + this);
        };
 
        Expression.prototype.assign = function assign() {
          throw new Error('Cannot assign to ' + this);
        };
 
        Expression.prototype.toString = function toString() {
          return Unparser.unparse(this);
        };
 
        return Expression;
      })();
 
      _export('Expression', Expression);
 
      Chain = (function (_Expression) {
        function Chain(expressions) {
          _classCallCheck(this, Chain);
 
          _Expression.call(this);
 
          this.expressions = expressions;
          this.isChain = true;
        }
 
        _inherits(Chain, _Expression);
 
        Chain.prototype.evaluate = function evaluate(scope, valueConverters) {
          var result,
              expressions = this.expressions,
              length = expressions.length,
              i,
              last;
 
          for (i = 0; i < length; ++i) {
            last = expressions[i].evaluate(scope, valueConverters);
 
            if (last !== null) {
              result = last;
            }
          }
 
          return result;
        };
 
        Chain.prototype.accept = function accept(visitor) {
          visitor.visitChain(this);
        };
 
        return Chain;
      })(Expression);
 
      _export('Chain', Chain);
 
      ValueConverter = (function (_Expression2) {
        function ValueConverter(expression, name, args, allArgs) {
          _classCallCheck(this, ValueConverter);
 
          _Expression2.call(this);
 
          this.expression = expression;
          this.name = name;
          this.args = args;
          this.allArgs = allArgs;
        }
 
        _inherits(ValueConverter, _Expression2);
 
        ValueConverter.prototype.evaluate = function evaluate(scope, valueConverters) {
          var converter = valueConverters(this.name);
          if (!converter) {
            throw new Error('No ValueConverter named "' + this.name + '" was found!');
          }
 
          if ('toView' in converter) {
            return converter.toView.apply(converter, evalList(scope, this.allArgs, valueConverters));
          }
 
          return this.allArgs[0].evaluate(scope, valueConverters);
        };
 
        ValueConverter.prototype.assign = function assign(scope, value, valueConverters) {
          var converter = valueConverters(this.name);
          if (!converter) {
            throw new Error('No ValueConverter named "' + this.name + '" was found!');
          }
 
          if ('fromView' in converter) {
            value = converter.fromView.apply(converter, [value].concat(evalList(scope, this.args, valueConverters)));
          }
 
          return this.allArgs[0].assign(scope, value, valueConverters);
        };
 
        ValueConverter.prototype.accept = function accept(visitor) {
          visitor.visitValueConverter(this);
        };
 
        ValueConverter.prototype.connect = function connect(binding, scope) {
          var _this = this;
 
          var observer,
              childObservers = [],
              i,
              ii,
              exp,
              expInfo;
 
          for (i = 0, ii = this.allArgs.length; i < ii; ++i) {
            exp = this.allArgs[i];
            expInfo = exp.connect(binding, scope);
 
            if (expInfo.observer) {
              childObservers.push(expInfo.observer);
            }
          }
 
          if (childObservers.length) {
            observer = new CompositeObserver(childObservers, function () {
              return _this.evaluate(scope, binding.valueConverterLookupFunction);
            });
          }
 
          return {
            value: this.evaluate(scope, binding.valueConverterLookupFunction),
            observer: observer
          };
        };
 
        return ValueConverter;
      })(Expression);
 
      _export('ValueConverter', ValueConverter);
 
      Assign = (function (_Expression3) {
        function Assign(target, value) {
          _classCallCheck(this, Assign);
 
          _Expression3.call(this);
 
          this.target = target;
          this.value = value;
        }
 
        _inherits(Assign, _Expression3);
 
        Assign.prototype.evaluate = function evaluate(scope, valueConverters) {
          return this.target.assign(scope, this.value.evaluate(scope, valueConverters));
        };
 
        Assign.prototype.accept = function accept(vistor) {
          vistor.visitAssign(this);
        };
 
        Assign.prototype.connect = function connect(binding, scope) {
          return { value: this.evaluate(scope, binding.valueConverterLookupFunction) };
        };
 
        return Assign;
      })(Expression);
 
      _export('Assign', Assign);
 
      Conditional = (function (_Expression4) {
        function Conditional(condition, yes, no) {
          _classCallCheck(this, Conditional);
 
          _Expression4.call(this);
 
          this.condition = condition;
          this.yes = yes;
          this.no = no;
        }
 
        _inherits(Conditional, _Expression4);
 
        Conditional.prototype.evaluate = function evaluate(scope, valueConverters) {
          return !!this.condition.evaluate(scope) ? this.yes.evaluate(scope) : this.no.evaluate(scope);
        };
 
        Conditional.prototype.accept = function accept(visitor) {
          visitor.visitConditional(this);
        };
 
        Conditional.prototype.connect = function connect(binding, scope) {
          var _this2 = this;
 
          var conditionInfo = this.condition.connect(binding, scope),
              yesInfo = this.yes.connect(binding, scope),
              noInfo = this.no.connect(binding, scope),
              childObservers = [],
              observer;
 
          if (conditionInfo.observer) {
            childObservers.push(conditionInfo.observer);
          }
 
          if (yesInfo.observer) {
            childObservers.push(yesInfo.observer);
          }
 
          if (noInfo.observer) {
            childObservers.push(noInfo.observer);
          }
 
          if (childObservers.length) {
            observer = new CompositeObserver(childObservers, function () {
              return _this2.evaluate(scope, binding.valueConverterLookupFunction);
            });
          }
 
          return {
            value: !!conditionInfo.value ? yesInfo.value : noInfo.value,
            observer: observer
          };
        };
 
        return Conditional;
      })(Expression);
 
      _export('Conditional', Conditional);
 
      AccessScope = (function (_Expression5) {
        function AccessScope(name) {
          _classCallCheck(this, AccessScope);
 
          _Expression5.call(this);
 
          this.name = name;
          this.isAssignable = true;
        }
 
        _inherits(AccessScope, _Expression5);
 
        AccessScope.prototype.evaluate = function evaluate(scope, valueConverters) {
          return scope[this.name];
        };
 
        AccessScope.prototype.assign = function assign(scope, value) {
          return scope[this.name] = value;
        };
 
        AccessScope.prototype.accept = function accept(visitor) {
          visitor.visitAccessScope(this);
        };
 
        AccessScope.prototype.connect = function connect(binding, scope) {
          var observer = binding.getObserver(scope, this.name);
 
          return {
            value: observer.getValue(),
            observer: observer
          };
        };
 
        return AccessScope;
      })(Expression);
 
      _export('AccessScope', AccessScope);
 
      AccessMember = (function (_Expression6) {
        function AccessMember(object, name) {
          _classCallCheck(this, AccessMember);
 
          _Expression6.call(this);
 
          this.object = object;
          this.name = name;
          this.isAssignable = true;
        }
 
        _inherits(AccessMember, _Expression6);
 
        AccessMember.prototype.evaluate = function evaluate(scope, valueConverters) {
          var instance = this.object.evaluate(scope, valueConverters);
          return instance === null || instance === undefined ? instance : instance[this.name];
        };
 
        AccessMember.prototype.assign = function assign(scope, value) {
          var instance = this.object.evaluate(scope);
 
          Iif (instance === null || instance === undefined) {
            instance = {};
            this.object.assign(scope, instance);
          }
 
          return instance[this.name] = value;
        };
 
        AccessMember.prototype.accept = function accept(visitor) {
          visitor.visitAccessMember(this);
        };
 
        AccessMember.prototype.connect = function connect(binding, scope) {
          var _this3 = this;
 
          var info = this.object.connect(binding, scope),
              objectInstance = info.value,
              objectObserver = info.observer,
              observer;
 
          Eif (objectObserver) {
            observer = new PathObserver(objectObserver, function (value) {
              Iif (value == null || value == undefined) {
                return value;
              }
 
              return binding.getObserver(value, _this3.name);
            }, objectInstance);
          } else {
            observer = binding.getObserver(objectInstance, this.name);
          }
 
          return {
            value: objectInstance == null ? null : objectInstance[this.name], //TODO: use prop abstraction
            observer: observer
          };
        };
 
        return AccessMember;
      })(Expression);
 
      _export('AccessMember', AccessMember);
 
      AccessKeyed = (function (_Expression7) {
        function AccessKeyed(object, key) {
          _classCallCheck(this, AccessKeyed);
 
          _Expression7.call(this);
 
          this.object = object;
          this.key = key;
          this.isAssignable = true;
        }
 
        _inherits(AccessKeyed, _Expression7);
 
        AccessKeyed.prototype.evaluate = function evaluate(scope, valueConverters) {
          var instance = this.object.evaluate(scope, valueConverters);
          var lookup = this.key.evaluate(scope, valueConverters);
          return getKeyed(instance, lookup);
        };
 
        AccessKeyed.prototype.assign = function assign(scope, value) {
          var instance = this.object.evaluate(scope);
          var lookup = this.key.evaluate(scope);
          return setKeyed(instance, lookup, value);
        };
 
        AccessKeyed.prototype.accept = function accept(visitor) {
          visitor.visitAccessKeyed(this);
        };
 
        AccessKeyed.prototype.connect = function connect(binding, scope) {
          var _this4 = this;
 
          var objectInfo = this.object.connect(binding, scope),
              keyInfo = this.key.connect(binding, scope),
              observer = new AccessKeyedObserver(objectInfo, keyInfo, binding.observerLocator, function () {
            return _this4.evaluate(scope, binding.valueConverterLookupFunction);
          });
 
          return {
            value: this.evaluate(scope, binding.valueConverterLookupFunction),
            observer: observer
          };
        };
 
        return AccessKeyed;
      })(Expression);
 
      _export('AccessKeyed', AccessKeyed);
 
      CallScope = (function (_Expression8) {
        function CallScope(name, args) {
          _classCallCheck(this, CallScope);
 
          _Expression8.call(this);
 
          this.name = name;
          this.args = args;
        }
 
        _inherits(CallScope, _Expression8);
 
        CallScope.prototype.evaluate = function evaluate(scope, valueConverters, args) {
          args = args || evalList(scope, this.args, valueConverters);
          return ensureFunctionFromMap(scope, this.name).apply(scope, args);
        };
 
        CallScope.prototype.accept = function accept(visitor) {
          visitor.visitCallScope(this);
        };
 
        CallScope.prototype.connect = function connect(binding, scope) {
          var _this5 = this;
 
          var observer,
              childObservers = [],
              i,
              ii,
              exp,
              expInfo;
 
          for (i = 0, ii = this.args.length; i < ii; ++i) {
            exp = this.args[i];
            expInfo = exp.connect(binding, scope);
 
            if (expInfo.observer) {
              childObservers.push(expInfo.observer);
            }
          }
 
          if (childObservers.length) {
            observer = new CompositeObserver(childObservers, function () {
              return _this5.evaluate(scope, binding.valueConverterLookupFunction);
            });
          }
 
          return {
            value: this.evaluate(scope, binding.valueConverterLookupFunction),
            observer: observer
          };
        };
 
        return CallScope;
      })(Expression);
 
      _export('CallScope', CallScope);
 
      CallMember = (function (_Expression9) {
        function CallMember(object, name, args) {
          _classCallCheck(this, CallMember);
 
          _Expression9.call(this);
 
          this.object = object;
          this.name = name;
          this.args = args;
        }
 
        _inherits(CallMember, _Expression9);
 
        CallMember.prototype.evaluate = function evaluate(scope, valueConverters, args) {
          var instance = this.object.evaluate(scope, valueConverters);
          args = args || evalList(scope, this.args, valueConverters);
          return ensureFunctionFromMap(instance, this.name).apply(instance, args);
        };
 
        CallMember.prototype.accept = function accept(visitor) {
          visitor.visitCallMember(this);
        };
 
        CallMember.prototype.connect = function connect(binding, scope) {
          var _this6 = this;
 
          var observer,
              objectInfo = this.object.connect(binding, scope),
              childObservers = [],
              i,
              ii,
              exp,
              expInfo;
 
          if (objectInfo.observer) {
            childObservers.push(objectInfo.observer);
          }
 
          for (i = 0, ii = this.args.length; i < ii; ++i) {
            exp = this.args[i];
            expInfo = exp.connect(binding, scope);
 
            if (expInfo.observer) {
              childObservers.push(expInfo.observer);
            }
          }
 
          if (childObservers.length) {
            observer = new CompositeObserver(childObservers, function () {
              return _this6.evaluate(scope, binding.valueConverterLookupFunction);
            });
          }
 
          return {
            value: this.evaluate(scope, binding.valueConverterLookupFunction),
            observer: observer
          };
        };
 
        return CallMember;
      })(Expression);
 
      _export('CallMember', CallMember);
 
      CallFunction = (function (_Expression10) {
        function CallFunction(func, args) {
          _classCallCheck(this, CallFunction);
 
          _Expression10.call(this);
 
          this.func = func;
          this.args = args;
        }
 
        _inherits(CallFunction, _Expression10);
 
        CallFunction.prototype.evaluate = function evaluate(scope, valueConverters, args) {
          var func = this.func.evaluate(scope, valueConverters);
 
          if (typeof func !== 'function') {
            throw new Error('' + this.func + ' is not a function');
          } else {
            return func.apply(null, args || evalList(scope, this.args, valueConverters));
          }
        };
 
        CallFunction.prototype.accept = function accept(visitor) {
          visitor.visitCallFunction(this);
        };
 
        CallFunction.prototype.connect = function connect(binding, scope) {
          var _this7 = this;
 
          var observer,
              funcInfo = this.func.connect(binding, scope),
              childObservers = [],
              i,
              ii,
              exp,
              expInfo;
 
          if (funcInfo.observer) {
            childObservers.push(funcInfo.observer);
          }
 
          for (i = 0, ii = this.args.length; i < ii; ++i) {
            exp = this.args[i];
            expInfo = exp.connect(binding, scope);
 
            if (expInfo.observer) {
              childObservers.push(expInfo.observer);
            }
          }
 
          if (childObservers.length) {
            observer = new CompositeObserver(childObservers, function () {
              return _this7.evaluate(scope, binding.valueConverterLookupFunction);
            });
          }
 
          return {
            value: this.evaluate(scope, binding.valueConverterLookupFunction),
            observer: observer
          };
        };
 
        return CallFunction;
      })(Expression);
 
      _export('CallFunction', CallFunction);
 
      Binary = (function (_Expression11) {
        function Binary(operation, left, right) {
          _classCallCheck(this, Binary);
 
          _Expression11.call(this);
 
          this.operation = operation;
          this.left = left;
          this.right = right;
        }
 
        _inherits(Binary, _Expression11);
 
        Binary.prototype.evaluate = function evaluate(scope, valueConverters) {
          var left = this.left.evaluate(scope);
 
          switch (this.operation) {
            case '&&':
              return left && this.right.evaluate(scope);
            case '||':
              return left || this.right.evaluate(scope);
          }
 
          var right = this.right.evaluate(scope);
 
          switch (this.operation) {
            case '==':
              return left == right;
            case '===':
              return left === right;
            case '!=':
              return left != right;
            case '!==':
              return left !== right;
          }
 
          // Null check for the operations.
          if (left === null || right === null) {
            switch (this.operation) {
              case '+':
                if (left != null) return left;
                if (right != null) return right;
                return 0;
              case '-':
                if (left != null) return left;
                if (right != null) return 0 - right;
                return 0;
            }
 
            return null;
          }
 
          switch (this.operation) {
            case '+':
              return autoConvertAdd(left, right);
            case '-':
              return left - right;
            case '*':
              return left * right;
            case '/':
              return left / right;
            case '%':
              return left % right;
            case '<':
              return left < right;
            case '>':
              return left > right;
            case '<=':
              return left <= right;
            case '>=':
              return left >= right;
            case '^':
              return left ^ right;
            case '&':
              return left & right;
          }
 
          throw new Error('Internal error [' + this.operation + '] not handled');
        };
 
        Binary.prototype.accept = function accept(visitor) {
          visitor.visitBinary(this);
        };
 
        Binary.prototype.connect = function connect(binding, scope) {
          var _this8 = this;
 
          var leftInfo = this.left.connect(binding, scope),
              rightInfo = this.right.connect(binding, scope),
              childObservers = [],
              observer;
 
          if (leftInfo.observer) {
            childObservers.push(leftInfo.observer);
          }
 
          if (rightInfo.observer) {
            childObservers.push(rightInfo.observer);
          }
 
          if (childObservers.length) {
            observer = new CompositeObserver(childObservers, function () {
              return _this8.evaluate(scope, binding.valueConverterLookupFunction);
            });
          }
 
          return {
            value: this.evaluate(scope, binding.valueConverterLookupFunction),
            observer: observer
          };
        };
 
        return Binary;
      })(Expression);
 
      _export('Binary', Binary);
 
      PrefixNot = (function (_Expression12) {
        function PrefixNot(operation, expression) {
          _classCallCheck(this, PrefixNot);
 
          _Expression12.call(this);
 
          this.operation = operation;
          this.expression = expression;
        }
 
        _inherits(PrefixNot, _Expression12);
 
        PrefixNot.prototype.evaluate = function evaluate(scope, valueConverters) {
          return !this.expression.evaluate(scope);
        };
 
        PrefixNot.prototype.accept = function accept(visitor) {
          visitor.visitPrefix(this);
        };
 
        PrefixNot.prototype.connect = function connect(binding, scope) {
          var _this9 = this;
 
          var info = this.expression.connect(binding, scope),
              observer;
 
          if (info.observer) {
            observer = new CompositeObserver([info.observer], function () {
              return _this9.evaluate(scope, binding.valueConverterLookupFunction);
            });
          }
 
          return {
            value: !info.value,
            observer: observer
          };
        };
 
        return PrefixNot;
      })(Expression);
 
      _export('PrefixNot', PrefixNot);
 
      LiteralPrimitive = (function (_Expression13) {
        function LiteralPrimitive(value) {
          _classCallCheck(this, LiteralPrimitive);
 
          _Expression13.call(this);
 
          this.value = value;
        }
 
        _inherits(LiteralPrimitive, _Expression13);
 
        LiteralPrimitive.prototype.evaluate = function evaluate(scope, valueConverters) {
          return this.value;
        };
 
        LiteralPrimitive.prototype.accept = function accept(visitor) {
          visitor.visitLiteralPrimitive(this);
        };
 
        LiteralPrimitive.prototype.connect = function connect(binding, scope) {
          return { value: this.value };
        };
 
        return LiteralPrimitive;
      })(Expression);
 
      _export('LiteralPrimitive', LiteralPrimitive);
 
      LiteralString = (function (_Expression14) {
        function LiteralString(value) {
          _classCallCheck(this, LiteralString);
 
          _Expression14.call(this);
 
          this.value = value;
        }
 
        _inherits(LiteralString, _Expression14);
 
        LiteralString.prototype.evaluate = function evaluate(scope, valueConverters) {
          return this.value;
        };
 
        LiteralString.prototype.accept = function accept(visitor) {
          visitor.visitLiteralString(this);
        };
 
        LiteralString.prototype.connect = function connect(binding, scope) {
          return { value: this.value };
        };
 
        return LiteralString;
      })(Expression);
 
      _export('LiteralString', LiteralString);
 
      LiteralArray = (function (_Expression15) {
        function LiteralArray(elements) {
          _classCallCheck(this, LiteralArray);
 
          _Expression15.call(this);
 
          this.elements = elements;
        }
 
        _inherits(LiteralArray, _Expression15);
 
        LiteralArray.prototype.evaluate = function evaluate(scope, valueConverters) {
          var elements = this.elements,
              length = elements.length,
              result = [],
              i;
 
          for (i = 0; i < length; ++i) {
            result[i] = elements[i].evaluate(scope, valueConverters);
          }
 
          return result;
        };
 
        LiteralArray.prototype.accept = function accept(visitor) {
          visitor.visitLiteralArray(this);
        };
 
        LiteralArray.prototype.connect = function connect(binding, scope) {
          var _this10 = this;
 
          var observer,
              childObservers = [],
              results = [],
              i,
              ii,
              exp,
              expInfo;
 
          for (i = 0, ii = this.elements.length; i < ii; ++i) {
            exp = this.elements[i];
            expInfo = exp.connect(binding, scope);
 
            Iif (expInfo.observer) {
              childObservers.push(expInfo.observer);
            }
 
            results[i] = expInfo.value;
          }
 
          Iif (childObservers.length) {
            observer = new CompositeObserver(childObservers, function () {
              return _this10.evaluate(scope, binding.valueConverterLookupFunction);
            });
          }
 
          return {
            value: results,
            observer: observer
          };
        };
 
        return LiteralArray;
      })(Expression);
 
      _export('LiteralArray', LiteralArray);
 
      LiteralObject = (function (_Expression16) {
        function LiteralObject(keys, values) {
          _classCallCheck(this, LiteralObject);
 
          _Expression16.call(this);
 
          this.keys = keys;
          this.values = values;
        }
 
        _inherits(LiteralObject, _Expression16);
 
        LiteralObject.prototype.evaluate = function evaluate(scope, valueConverters) {
          var instance = {},
              keys = this.keys,
              values = this.values,
              length = keys.length,
              i;
 
          for (i = 0; i < length; ++i) {
            instance[keys[i]] = values[i].evaluate(scope, valueConverters);
          }
 
          return instance;
        };
 
        LiteralObject.prototype.accept = function accept(visitor) {
          visitor.visitLiteralObject(this);
        };
 
        LiteralObject.prototype.connect = function connect(binding, scope) {
          var _this11 = this;
 
          var observer,
              childObservers = [],
              instance = {},
              keys = this.keys,
              values = this.values,
              length = keys.length,
              i,
              valueInfo;
 
          for (i = 0; i < length; ++i) {
            valueInfo = values[i].connect(binding, scope);
 
            Iif (valueInfo.observer) {
              childObservers.push(valueInfo.observer);
            }
 
            instance[keys[i]] = valueInfo.value;
          }
 
          Iif (childObservers.length) {
            observer = new CompositeObserver(childObservers, function () {
              return _this11.evaluate(scope, binding.valueConverterLookupFunction);
            });
          }
 
          return {
            value: instance,
            observer: observer
          };
        };
 
        return LiteralObject;
      })(Expression);
 
      _export('LiteralObject', LiteralObject);
 
      Unparser = (function () {
        function Unparser(buffer) {
          _classCallCheck(this, Unparser);
 
          this.buffer = buffer;
        }
 
        Unparser.unparse = function unparse(expression) {
          var buffer = [],
              visitor = new Unparser(buffer);
 
          expression.accept(visitor);
 
          return buffer.join('');
        };
 
        Unparser.prototype.write = function write(text) {
          this.buffer.push(text);
        };
 
        Unparser.prototype.writeArgs = function writeArgs(args) {
          var i, length;
 
          this.write('(');
 
          for (i = 0, length = args.length; i < length; ++i) {
            if (i !== 0) {
              this.write(',');
            }
 
            args[i].accept(this);
          }
 
          this.write(')');
        };
 
        Unparser.prototype.visitChain = function visitChain(chain) {
          var expressions = chain.expressions,
              length = expressions.length,
              i;
 
          for (i = 0; i < length; ++i) {
            if (i !== 0) {
              this.write(';');
            }
 
            expressions[i].accept(this);
          }
        };
 
        Unparser.prototype.visitValueConverter = function visitValueConverter(converter) {
          var args = converter.args,
              length = args.length,
              i;
 
          this.write('(');
          converter.expression.accept(this);
          this.write('|' + converter.name);
 
          for (i = 0; i < length; ++i) {
            this.write(' :');
            args[i].accept(this);
          }
 
          this.write(')');
        };
 
        Unparser.prototype.visitAssign = function visitAssign(assign) {
          assign.target.accept(this);
          this.write('=');
          assign.value.accept(this);
        };
 
        Unparser.prototype.visitConditional = function visitConditional(conditional) {
          conditional.condition.accept(this);
          this.write('?');
          conditional.yes.accept(this);
          this.write(':');
          conditional.no.accept(this);
        };
 
        Unparser.prototype.visitAccessScope = function visitAccessScope(access) {
          this.write(access.name);
        };
 
        Unparser.prototype.visitAccessMember = function visitAccessMember(access) {
          access.object.accept(this);
          this.write('.' + access.name);
        };
 
        Unparser.prototype.visitAccessKeyed = function visitAccessKeyed(access) {
          access.object.accept(this);
          this.write('[');
          access.key.accept(this);
          this.write(']');
        };
 
        Unparser.prototype.visitCallScope = function visitCallScope(call) {
          this.write(call.name);
          this.writeArgs(call.args);
        };
 
        Unparser.prototype.visitCallFunction = function visitCallFunction(call) {
          call.func.accept(this);
          this.writeArgs(call.args);
        };
 
        Unparser.prototype.visitCallMember = function visitCallMember(call) {
          call.object.accept(this);
          this.write('.' + call.name);
          this.writeArgs(call.args);
        };
 
        Unparser.prototype.visitPrefix = function visitPrefix(prefix) {
          this.write('(' + prefix.operation);
          prefix.expression.accept(this);
          this.write(')');
        };
 
        Unparser.prototype.visitBinary = function visitBinary(binary) {
          this.write('(');
          binary.left.accept(this);
          this.write(binary.operation);
          binary.right.accept(this);
          this.write(')');
        };
 
        Unparser.prototype.visitLiteralPrimitive = function visitLiteralPrimitive(literal) {
          this.write('' + literal.value);
        };
 
        Unparser.prototype.visitLiteralArray = function visitLiteralArray(literal) {
          var elements = literal.elements,
              length = elements.length,
              i;
 
          this.write('[');
 
          for (i = 0; i < length; ++i) {
            if (i !== 0) {
              this.write(',');
            }
 
            elements[i].accept(this);
          }
 
          this.write(']');
        };
 
        Unparser.prototype.visitLiteralObject = function visitLiteralObject(literal) {
          var keys = literal.keys,
              values = literal.values,
              length = keys.length,
              i;
 
          this.write('{');
 
          for (i = 0; i < length; ++i) {
            if (i !== 0) {
              this.write(',');
            }
 
            this.write('\'' + keys[i] + '\':');
            values[i].accept(this);
          }
 
          this.write('}');
        };
 
        Unparser.prototype.visitLiteralString = function visitLiteralString(literal) {
          var escaped = literal.value.replace(/'/g, '\'');
          this.write('\'' + escaped + '\'');
        };
 
        return Unparser;
      })();
 
      _export('Unparser', Unparser);
 
      evalListCache = [[], [0], [0, 0], [0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0]];
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2JpbmRpbmcvc3JjL2FzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7NERBSWEsVUFBVSxFQW1CVixLQUFLLEVBOEJMLGNBQWMsRUFtRWQsTUFBTSxFQXFCTixXQUFXLEVBaURYLFdBQVcsRUE4QlgsWUFBWSxFQTREWixXQUFXLEVBc0NYLFNBQVMsRUE0Q1QsVUFBVSxFQW1EVixZQUFZLEVBc0RaLE1BQU0sRUEwRk4sU0FBUyxFQWlDVCxnQkFBZ0IsRUFvQmhCLGFBQWEsRUFvQmIsWUFBWSxFQXNEWixhQUFhLEVBMERiLFFBQVEsRUE2S2pCLGFBQWE7Ozs7Ozs7QUFHakIsV0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFDcEIsV0FBVztRQUFFLENBQUMsQ0FBQzs7QUFFbkIsU0FBSyxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxXQUFXLElBQUksTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFO0FBQzdFLG1CQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3hCOztBQUVELFFBQUksTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7QUFFbkMsU0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDM0IsWUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0tBQ3REOztBQUVELFdBQU8sTUFBTSxDQUFDO0dBQ2Y7OztBQUdELFdBQVMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDNUIsUUFBSSxDQUFDLElBQUksSUFB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QyxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6Ii9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2JpbmRpbmcvc3JjL2FzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UGF0aE9ic2VydmVyfSBmcm9tICcuL3BhdGgtb2JzZXJ2ZXInO1xuaW1wb3J0IHtDb21wb3NpdGVPYnNlcnZlcn0gZnJvbSAnLi9jb21wb3NpdGUtb2JzZXJ2ZXInO1xuaW1wb3J0IHtBY2Nlc3NLZXllZE9ic2VydmVyfSBmcm9tICcuL2FjY2Vzcy1rZXllZC1vYnNlcnZlcic7XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoKXtcbiAgICB0aGlzLmlzQ2hhaW4gPSBmYWxzZTtcbiAgICB0aGlzLmlzQXNzaWduYWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgZXZhbHVhdGUoKXtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBldmFsdWF0ZSAke3RoaXN9YCk7XG4gIH1cblxuICBhc3NpZ24oKXtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhc3NpZ24gdG8gJHt0aGlzfWApO1xuICB9XG5cbiAgdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gVW5wYXJzZXIudW5wYXJzZSh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2hhaW4gZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbnMpe1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7XG4gICAgdGhpcy5pc0NoYWluID0gdHJ1ZTtcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnMsXG4gICAgICAgIGxlbmd0aCA9IGV4cHJlc3Npb25zLmxlbmd0aCxcbiAgICAgICAgaSwgbGFzdDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgbGFzdCA9IGV4cHJlc3Npb25zW2ldLmV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpO1xuXG4gICAgICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQgPSBsYXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdENoYWluKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWYWx1ZUNvbnZlcnRlciBleHRlbmRzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uLCBuYW1lLCBhcmdzLCBhbGxBcmdzKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgdGhpcy5hbGxBcmdzID0gYWxsQXJncztcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpe1xuICAgIHZhciBjb252ZXJ0ZXIgPSB2YWx1ZUNvbnZlcnRlcnModGhpcy5uYW1lKTtcbiAgICBpZighY29udmVydGVyKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gVmFsdWVDb252ZXJ0ZXIgbmFtZWQgXCIke3RoaXMubmFtZX1cIiB3YXMgZm91bmQhYCk7XG4gICAgfVxuXG4gICAgaWYoJ3RvVmlldycgaW4gY29udmVydGVyKXtcbiAgICAgIHJldHVybiBjb252ZXJ0ZXIudG9WaWV3LmFwcGx5KGNvbnZlcnRlciwgZXZhbExpc3Qoc2NvcGUsIHRoaXMuYWxsQXJncywgdmFsdWVDb252ZXJ0ZXJzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWxsQXJnc1swXS5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgfVxuXG4gIGFzc2lnbihzY29wZSwgdmFsdWUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgdmFyIGNvbnZlcnRlciA9IHZhbHVlQ29udmVydGVycyh0aGlzLm5hbWUpO1xuICAgIGlmKCFjb252ZXJ0ZXIpe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBWYWx1ZUNvbnZlcnRlciBuYW1lZCBcIiR7dGhpcy5uYW1lfVwiIHdhcyBmb3VuZCFgKTtcbiAgICB9XG5cbiAgICBpZignZnJvbVZpZXcnIGluIGNvbnZlcnRlcil7XG4gICAgICB2YWx1ZSA9IGNvbnZlcnRlci5mcm9tVmlldy5hcHBseShjb252ZXJ0ZXIsIFt2YWx1ZV0uY29uY2F0KGV2YWxMaXN0KHNjb3BlLCB0aGlzLmFyZ3MsIHZhbHVlQ29udmVydGVycykpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hbGxBcmdzWzBdLmFzc2lnbihzY29wZSwgdmFsdWUsIHZhbHVlQ29udmVydGVycyk7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdFZhbHVlQ29udmVydGVyKHRoaXMpO1xuICB9XG5cbiAgY29ubmVjdChiaW5kaW5nLCBzY29wZSl7XG4gICAgdmFyIG9ic2VydmVyLFxuICAgICAgICBjaGlsZE9ic2VydmVycyA9IFtdLFxuICAgICAgICBpLCBpaSwgZXhwLCBleHBJbmZvO1xuXG4gICAgZm9yKGkgPSAwLCBpaSA9IHRoaXMuYWxsQXJncy5sZW5ndGg7IGk8aWk7ICsraSl7XG4gICAgICBleHAgPSB0aGlzLmFsbEFyZ3NbaV1cbiAgICAgIGV4cEluZm8gPSBleHAuY29ubmVjdChiaW5kaW5nLCBzY29wZSk7XG5cbiAgICAgIGlmKGV4cEluZm8ub2JzZXJ2ZXIpe1xuICAgICAgICBjaGlsZE9ic2VydmVycy5wdXNoKGV4cEluZm8ub2JzZXJ2ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGNoaWxkT2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICBvYnNlcnZlciA9IG5ldyBDb21wb3NpdGVPYnNlcnZlcihjaGlsZE9ic2VydmVycywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTp0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pLFxuICAgICAgb2JzZXJ2ZXI6b2JzZXJ2ZXJcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NpZ24gZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0LCB2YWx1ZSl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpe1xuICAgIHJldHVybiB0aGlzLnRhcmdldC5hc3NpZ24oc2NvcGUsIHRoaXMudmFsdWUuZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycykpO1xuICB9XG5cbiAgYWNjZXB0KHZpc3Rvcil7XG4gICAgdmlzdG9yLnZpc2l0QXNzaWduKHRoaXMpO1xuICB9XG5cbiAgY29ubmVjdChiaW5kaW5nLCBzY29wZSl7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMuZXZhbHVhdGUoc2NvcGUsIGJpbmRpbmcudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbikgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoY29uZGl0aW9uLCB5ZXMsIG5vKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgdGhpcy55ZXMgPSB5ZXM7XG4gICAgdGhpcy5ubyA9IG5vO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgcmV0dXJuICghIXRoaXMuY29uZGl0aW9uLmV2YWx1YXRlKHNjb3BlKSkgPyB0aGlzLnllcy5ldmFsdWF0ZShzY29wZSkgOiB0aGlzLm5vLmV2YWx1YXRlKHNjb3BlKTtcbiAgfVxuXG4gIGFjY2VwdCh2aXNpdG9yKXtcbiAgICB2aXNpdG9yLnZpc2l0Q29uZGl0aW9uYWwodGhpcyk7XG4gIH1cblxuICBjb25uZWN0KGJpbmRpbmcsIHNjb3BlKXtcbiAgICB2YXIgY29uZGl0aW9uSW5mbyA9IHRoaXMuY29uZGl0aW9uLmNvbm5lY3QoYmluZGluZywgc2NvcGUpLFxuICAgICAgICB5ZXNJbmZvID0gdGhpcy55ZXMuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIG5vSW5mbyA9IHRoaXMubm8uY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIG9ic2VydmVyO1xuXG4gICAgaWYoY29uZGl0aW9uSW5mby5vYnNlcnZlcil7XG4gICAgICBjaGlsZE9ic2VydmVycy5wdXNoKGNvbmRpdGlvbkluZm8ub2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIGlmKHllc0luZm8ub2JzZXJ2ZXIpe1xuICAgICAgY2hpbGRPYnNlcnZlcnMucHVzaCh5ZXNJbmZvLm9ic2VydmVyKTtcbiAgICB9XG5cbiAgICBpZihub0luZm8ub2JzZXJ2ZXIpe1xuICAgICAgY2hpbGRPYnNlcnZlcnMucHVzaChub0luZm8ub2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIGlmKGNoaWxkT2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICBvYnNlcnZlciA9IG5ldyBDb21wb3NpdGVPYnNlcnZlcihjaGlsZE9ic2VydmVycywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTooISFjb25kaXRpb25JbmZvLnZhbHVlKSA/IHllc0luZm8udmFsdWUgOiBub0luZm8udmFsdWUsXG4gICAgICBvYnNlcnZlcjogb2JzZXJ2ZXJcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NTY29wZSBleHRlbmRzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihuYW1lKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmlzQXNzaWduYWJsZSA9IHRydWU7XG4gIH1cblxuICBldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKXtcbiAgICByZXR1cm4gc2NvcGVbdGhpcy5uYW1lXTtcbiAgfVxuXG4gIGFzc2lnbihzY29wZSwgdmFsdWUpe1xuICAgIHJldHVybiBzY29wZVt0aGlzLm5hbWVdID0gdmFsdWU7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdEFjY2Vzc1Njb3BlKHRoaXMpO1xuICB9XG5cbiAgY29ubmVjdChiaW5kaW5nLCBzY29wZSl7XG4gICAgdmFyIG9ic2VydmVyID0gYmluZGluZy5nZXRPYnNlcnZlcihzY29wZSwgdGhpcy5uYW1lKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogb2JzZXJ2ZXIuZ2V0VmFsdWUoKSxcbiAgICAgIG9ic2VydmVyOiBvYnNlcnZlclxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWNjZXNzTWVtYmVyIGV4dGVuZHMgRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKG9iamVjdCwgbmFtZSl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5pc0Fzc2lnbmFibGUgPSB0cnVlO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgdmFyIGluc3RhbmNlID0gdGhpcy5vYmplY3QuZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyk7XG4gICAgcmV0dXJuIGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB1bmRlZmluZWRcbiAgICAgID8gaW5zdGFuY2VcbiAgICAgIDogaW5zdGFuY2VbdGhpcy5uYW1lXTtcbiAgfVxuXG4gIGFzc2lnbihzY29wZSwgdmFsdWUpe1xuICAgIHZhciBpbnN0YW5jZSA9IHRoaXMub2JqZWN0LmV2YWx1YXRlKHNjb3BlKTtcblxuICAgIGlmKGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB1bmRlZmluZWQpe1xuICAgICAgaW5zdGFuY2UgPSB7fTtcbiAgICAgIHRoaXMub2JqZWN0LmFzc2lnbihzY29wZSwgaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZVt0aGlzLm5hbWVdID0gdmFsdWU7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdEFjY2Vzc01lbWJlcih0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBpbmZvID0gdGhpcy5vYmplY3QuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIG9iamVjdEluc3RhbmNlID0gaW5mby52YWx1ZSxcbiAgICAgICAgb2JqZWN0T2JzZXJ2ZXIgPSBpbmZvLm9ic2VydmVyLFxuICAgICAgICBvYnNlcnZlcjtcblxuICAgIGlmKG9iamVjdE9ic2VydmVyKXtcbiAgICAgIG9ic2VydmVyID0gbmV3IFBhdGhPYnNlcnZlcihcbiAgICAgICAgb2JqZWN0T2JzZXJ2ZXIsXG4gICAgICAgIHZhbHVlID0+IHtcbiAgICAgICAgICBpZih2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGJpbmRpbmcuZ2V0T2JzZXJ2ZXIodmFsdWUsIHRoaXMubmFtZSlcbiAgICAgICAgfSxcbiAgICAgICAgb2JqZWN0SW5zdGFuY2VcbiAgICAgICAgKTtcbiAgICB9ZWxzZXtcbiAgICAgIG9ic2VydmVyID0gYmluZGluZy5nZXRPYnNlcnZlcihvYmplY3RJbnN0YW5jZSwgdGhpcy5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG9iamVjdEluc3RhbmNlID09IG51bGwgPyBudWxsIDogb2JqZWN0SW5zdGFuY2VbdGhpcy5uYW1lXSwgLy9UT0RPOiB1c2UgcHJvcCBhYnN0cmFjdGlvblxuICAgICAgb2JzZXJ2ZXI6IG9ic2VydmVyXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NLZXllZCBleHRlbmRzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihvYmplY3QsIGtleSl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMuaXNBc3NpZ25hYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpe1xuICAgIHZhciBpbnN0YW5jZSA9IHRoaXMub2JqZWN0LmV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpO1xuICAgIHZhciBsb29rdXAgPSB0aGlzLmtleS5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgICByZXR1cm4gZ2V0S2V5ZWQoaW5zdGFuY2UsIGxvb2t1cCk7XG4gIH1cblxuICBhc3NpZ24oc2NvcGUsIHZhbHVlKXtcbiAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLm9iamVjdC5ldmFsdWF0ZShzY29wZSk7XG4gICAgdmFyIGxvb2t1cCA9IHRoaXMua2V5LmV2YWx1YXRlKHNjb3BlKTtcbiAgICByZXR1cm4gc2V0S2V5ZWQoaW5zdGFuY2UsIGxvb2t1cCwgdmFsdWUpO1xuICB9XG5cbiAgYWNjZXB0KHZpc2l0b3Ipe1xuICAgIHZpc2l0b3IudmlzaXRBY2Nlc3NLZXllZCh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBvYmplY3RJbmZvID0gdGhpcy5vYmplY3QuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIGtleUluZm8gPSB0aGlzLmtleS5jb25uZWN0KGJpbmRpbmcsIHNjb3BlKSxcbiAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgQWNjZXNzS2V5ZWRPYnNlcnZlcihvYmplY3RJbmZvLCBrZXlJbmZvLCBiaW5kaW5nLm9ic2VydmVyTG9jYXRvcixcbiAgICAgICAgICAoKSA9PiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTp0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pLFxuICAgICAgb2JzZXJ2ZXI6b2JzZXJ2ZXJcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYWxsU2NvcGUgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IobmFtZSwgYXJncyl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMsIGFyZ3Mpe1xuICAgIGFyZ3MgPSBhcmdzIHx8IGV2YWxMaXN0KHNjb3BlLCB0aGlzLmFyZ3MsIHZhbHVlQ29udmVydGVycyk7XG4gICAgcmV0dXJuIGVuc3VyZUZ1bmN0aW9uRnJvbU1hcChzY29wZSwgdGhpcy5uYW1lKS5hcHBseShzY29wZSwgYXJncyk7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdENhbGxTY29wZSh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBvYnNlcnZlcixcbiAgICAgICAgY2hpbGRPYnNlcnZlcnMgPSBbXSxcbiAgICAgICAgaSwgaWksIGV4cCwgZXhwSW5mbztcblxuICAgIGZvcihpID0gMCwgaWkgPSB0aGlzLmFyZ3MubGVuZ3RoOyBpPGlpOyArK2kpe1xuICAgICAgZXhwID0gdGhpcy5hcmdzW2ldO1xuICAgICAgZXhwSW5mbyA9IGV4cC5jb25uZWN0KGJpbmRpbmcsIHNjb3BlKTtcblxuICAgICAgaWYoZXhwSW5mby5vYnNlcnZlcil7XG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzLnB1c2goZXhwSW5mby5vYnNlcnZlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY2hpbGRPYnNlcnZlcnMubGVuZ3RoKXtcbiAgICAgIG9ic2VydmVyID0gbmV3IENvbXBvc2l0ZU9ic2VydmVyKGNoaWxkT2JzZXJ2ZXJzLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOnRoaXMuZXZhbHVhdGUoc2NvcGUsIGJpbmRpbmcudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbiksXG4gICAgICBvYnNlcnZlcjpvYnNlcnZlclxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhbGxNZW1iZXIgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3Iob2JqZWN0LCBuYW1lLCBhcmdzKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycywgYXJncyl7XG4gICAgdmFyIGluc3RhbmNlID0gdGhpcy5vYmplY3QuZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyk7XG4gICAgYXJncyA9IGFyZ3MgfHwgZXZhbExpc3Qoc2NvcGUsIHRoaXMuYXJncywgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgICByZXR1cm4gZW5zdXJlRnVuY3Rpb25Gcm9tTWFwKGluc3RhbmNlLCB0aGlzLm5hbWUpLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcbiAgfVxuXG4gIGFjY2VwdCh2aXNpdG9yKXtcbiAgICB2aXNpdG9yLnZpc2l0Q2FsbE1lbWJlcih0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBvYnNlcnZlcixcbiAgICAgICAgb2JqZWN0SW5mbyA9IHRoaXMub2JqZWN0LmNvbm5lY3QoYmluZGluZywgc2NvcGUpLFxuICAgICAgICBjaGlsZE9ic2VydmVycyA9IFtdLFxuICAgICAgICBpLCBpaSwgZXhwLCBleHBJbmZvO1xuXG4gICAgaWYob2JqZWN0SW5mby5vYnNlcnZlcil7XG4gICAgICBjaGlsZE9ic2VydmVycy5wdXNoKG9iamVjdEluZm8ub2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIGZvcihpID0gMCwgaWkgPSB0aGlzLmFyZ3MubGVuZ3RoOyBpPGlpOyArK2kpe1xuICAgICAgZXhwID0gdGhpcy5hcmdzW2ldO1xuICAgICAgZXhwSW5mbyA9IGV4cC5jb25uZWN0KGJpbmRpbmcsIHNjb3BlKTtcblxuICAgICAgaWYoZXhwSW5mby5vYnNlcnZlcil7XG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzLnB1c2goZXhwSW5mby5vYnNlcnZlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY2hpbGRPYnNlcnZlcnMubGVuZ3RoKXtcbiAgICAgIG9ic2VydmVyID0gbmV3IENvbXBvc2l0ZU9ic2VydmVyKGNoaWxkT2JzZXJ2ZXJzLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOnRoaXMuZXZhbHVhdGUoc2NvcGUsIGJpbmRpbmcudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbiksXG4gICAgICBvYnNlcnZlcjpvYnNlcnZlclxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhbGxGdW5jdGlvbiBleHRlbmRzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihmdW5jLGFyZ3Mpe1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmZ1bmMgPSBmdW5jO1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gIH1cblxuICBldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzLCBhcmdzKXtcbiAgICB2YXIgZnVuYyA9IHRoaXMuZnVuYy5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcblxuICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuZnVuY30gaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkobnVsbCwgYXJncyB8fCBldmFsTGlzdChzY29wZSwgdGhpcy5hcmdzLCB2YWx1ZUNvbnZlcnRlcnMpKTtcbiAgICB9XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdENhbGxGdW5jdGlvbih0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBvYnNlcnZlcixcbiAgICAgICAgZnVuY0luZm8gPSB0aGlzLmZ1bmMuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIGksIGlpLCBleHAsIGV4cEluZm87XG5cbiAgICBpZihmdW5jSW5mby5vYnNlcnZlcil7XG4gICAgICBjaGlsZE9ic2VydmVycy5wdXNoKGZ1bmNJbmZvLm9ic2VydmVyKTtcbiAgICB9XG5cbiAgICBmb3IoaSA9IDAsIGlpID0gdGhpcy5hcmdzLmxlbmd0aDsgaTxpaTsgKytpKXtcbiAgICAgIGV4cCA9IHRoaXMuYXJnc1tpXTtcbiAgICAgIGV4cEluZm8gPSBleHAuY29ubmVjdChiaW5kaW5nLCBzY29wZSk7XG5cbiAgICAgIGlmKGV4cEluZm8ub2JzZXJ2ZXIpe1xuICAgICAgICBjaGlsZE9ic2VydmVycy5wdXNoKGV4cEluZm8ub2JzZXJ2ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGNoaWxkT2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICBvYnNlcnZlciA9IG5ldyBDb21wb3NpdGVPYnNlcnZlcihjaGlsZE9ic2VydmVycywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTp0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pLFxuICAgICAgb2JzZXJ2ZXI6b2JzZXJ2ZXJcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5hcnkgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3Iob3BlcmF0aW9uLCBsZWZ0LCByaWdodCl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgdmFyIGxlZnQgPSB0aGlzLmxlZnQuZXZhbHVhdGUoc2NvcGUpO1xuXG4gICAgc3dpdGNoICh0aGlzLm9wZXJhdGlvbikge1xuICAgICAgY2FzZSAnJiYnOiByZXR1cm4gbGVmdCAmJiB0aGlzLnJpZ2h0LmV2YWx1YXRlKHNjb3BlKTtcbiAgICAgIGNhc2UgJ3x8JzogcmV0dXJuIGxlZnQgfHwgdGhpcy5yaWdodC5ldmFsdWF0ZShzY29wZSk7XG4gICAgfVxuXG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5yaWdodC5ldmFsdWF0ZShzY29wZSk7XG5cbiAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICc9PScgOiByZXR1cm4gbGVmdCA9PSByaWdodDtcbiAgICAgIGNhc2UgJz09PSc6IHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgICAgIGNhc2UgJyE9JyA6IHJldHVybiBsZWZ0ICE9IHJpZ2h0O1xuICAgICAgY2FzZSAnIT09JzogcmV0dXJuIGxlZnQgIT09IHJpZ2h0O1xuICAgIH1cblxuICAgIC8vIE51bGwgY2hlY2sgZm9yIHRoZSBvcGVyYXRpb25zLlxuICAgIGlmIChsZWZ0ID09PSBudWxsIHx8IHJpZ2h0ID09PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgIGlmIChsZWZ0ICE9IG51bGwpIHJldHVybiBsZWZ0O1xuICAgICAgICAgIGlmIChyaWdodCAhPSBudWxsKSByZXR1cm4gcmlnaHQ7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgIGlmIChsZWZ0ICE9IG51bGwpIHJldHVybiBsZWZ0O1xuICAgICAgICAgIGlmIChyaWdodCAhPSBudWxsKSByZXR1cm4gMCAtIHJpZ2h0O1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICcrJyAgOiByZXR1cm4gYXV0b0NvbnZlcnRBZGQobGVmdCwgcmlnaHQpO1xuICAgICAgY2FzZSAnLScgIDogcmV0dXJuIGxlZnQgLSByaWdodDtcbiAgICAgIGNhc2UgJyonICA6IHJldHVybiBsZWZ0ICogcmlnaHQ7XG4gICAgICBjYXNlICcvJyAgOiByZXR1cm4gbGVmdCAvIHJpZ2h0O1xuICAgICAgY2FzZSAnJScgIDogcmV0dXJuIGxlZnQgJSByaWdodDtcbiAgICAgIGNhc2UgJzwnICA6IHJldHVybiBsZWZ0IDwgcmlnaHQ7XG4gICAgICBjYXNlICc+JyAgOiByZXR1cm4gbGVmdCA+IHJpZ2h0O1xuICAgICAgY2FzZSAnPD0nIDogcmV0dXJuIGxlZnQgPD0gcmlnaHQ7XG4gICAgICBjYXNlICc+PScgOiByZXR1cm4gbGVmdCA+PSByaWdodDtcbiAgICAgIGNhc2UgJ14nICA6IHJldHVybiBsZWZ0IF4gcmlnaHQ7XG4gICAgICBjYXNlICcmJyAgOiByZXR1cm4gbGVmdCAmIHJpZ2h0O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IgWyR7dGhpcy5vcGVyYXRpb259XSBub3QgaGFuZGxlZGApO1xuICB9XG5cbiAgYWNjZXB0KHZpc2l0b3Ipe1xuICAgIHZpc2l0b3IudmlzaXRCaW5hcnkodGhpcyk7XG4gIH1cblxuICBjb25uZWN0KGJpbmRpbmcsIHNjb3BlKXtcbiAgICB2YXIgbGVmdEluZm8gPSB0aGlzLmxlZnQuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIHJpZ2h0SW5mbyA9IHRoaXMucmlnaHQuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIG9ic2VydmVyO1xuXG4gICAgaWYobGVmdEluZm8ub2JzZXJ2ZXIpe1xuICAgICAgY2hpbGRPYnNlcnZlcnMucHVzaChsZWZ0SW5mby5vYnNlcnZlcik7XG4gICAgfVxuXG4gICAgaWYocmlnaHRJbmZvLm9ic2VydmVyKXtcbiAgICAgIGNoaWxkT2JzZXJ2ZXJzLnB1c2gocmlnaHRJbmZvLm9ic2VydmVyKTtcbiAgICB9XG5cbiAgICBpZihjaGlsZE9ic2VydmVycy5sZW5ndGgpe1xuICAgICAgb2JzZXJ2ZXIgPSBuZXcgQ29tcG9zaXRlT2JzZXJ2ZXIoY2hpbGRPYnNlcnZlcnMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoc2NvcGUsIGJpbmRpbmcudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6dGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKSxcbiAgICAgIG9ic2VydmVyOm9ic2VydmVyXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJlZml4Tm90IGV4dGVuZHMgRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKG9wZXJhdGlvbiwgZXhwcmVzc2lvbil7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gIH1cblxuICBldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKXtcbiAgICByZXR1cm4gIXRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShzY29wZSk7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdFByZWZpeCh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBpbmZvID0gdGhpcy5leHByZXNzaW9uLmNvbm5lY3QoYmluZGluZywgc2NvcGUpLFxuICAgICAgICBvYnNlcnZlcjtcblxuICAgIGlmKGluZm8ub2JzZXJ2ZXIpe1xuICAgICAgb2JzZXJ2ZXIgPSBuZXcgQ29tcG9zaXRlT2JzZXJ2ZXIoW2luZm8ub2JzZXJ2ZXJdLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiAhaW5mby52YWx1ZSxcbiAgICAgIG9ic2VydmVyOiBvYnNlcnZlclxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpdGVyYWxQcmltaXRpdmUgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IodmFsdWUpe1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKXtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuXG4gIGFjY2VwdCh2aXNpdG9yKXtcbiAgICB2aXNpdG9yLnZpc2l0TGl0ZXJhbFByaW1pdGl2ZSh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHJldHVybiB7IHZhbHVlOnRoaXMudmFsdWUgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXRlcmFsU3RyaW5nIGV4dGVuZHMgRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdExpdGVyYWxTdHJpbmcodGhpcyk7XG4gIH1cblxuICBjb25uZWN0KGJpbmRpbmcsIHNjb3BlKXtcbiAgICByZXR1cm4geyB2YWx1ZTp0aGlzLnZhbHVlIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGl0ZXJhbEFycmF5IGV4dGVuZHMgRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRzKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cyxcbiAgICAgICAgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgaTtcblxuICAgIGZvcihpID0gMDsgaSA8IGxlbmd0aDsgKytpKXtcbiAgICAgIHJlc3VsdFtpXSA9IGVsZW1lbnRzW2ldLmV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdExpdGVyYWxBcnJheSh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpIHtcbiAgICB2YXIgb2JzZXJ2ZXIsXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgaSwgaWksIGV4cCwgZXhwSW5mbztcblxuICAgIGZvcihpID0gMCwgaWkgPSB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaTxpaTsgKytpKXtcbiAgICAgIGV4cCA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICBleHBJbmZvID0gZXhwLmNvbm5lY3QoYmluZGluZywgc2NvcGUpO1xuXG4gICAgICBpZihleHBJbmZvLm9ic2VydmVyKXtcbiAgICAgICAgY2hpbGRPYnNlcnZlcnMucHVzaChleHBJbmZvLm9ic2VydmVyKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0c1tpXSA9IGV4cEluZm8udmFsdWU7XG4gICAgfVxuXG4gICAgaWYoY2hpbGRPYnNlcnZlcnMubGVuZ3RoKXtcbiAgICAgIG9ic2VydmVyID0gbmV3IENvbXBvc2l0ZU9ic2VydmVyKGNoaWxkT2JzZXJ2ZXJzLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOnJlc3VsdHMsXG4gICAgICBvYnNlcnZlcjpvYnNlcnZlclxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpdGVyYWxPYmplY3QgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3Ioa2V5cywgdmFsdWVzKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5rZXlzID0ga2V5cztcbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpe1xuICAgIHZhciBpbnN0YW5jZSA9IHt9LFxuICAgICAgICBrZXlzID0gdGhpcy5rZXlzLFxuICAgICAgICB2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcbiAgICAgICAgbGVuZ3RoID0ga2V5cy5sZW5ndGgsXG4gICAgICAgIGk7XG5cbiAgICBmb3IoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSl7XG4gICAgICBpbnN0YW5jZVtrZXlzW2ldXSA9IHZhbHVlc1tpXS5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdExpdGVyYWxPYmplY3QodGhpcyk7XG4gIH1cblxuICBjb25uZWN0KGJpbmRpbmcsIHNjb3BlKXtcbiAgICB2YXIgb2JzZXJ2ZXIsXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIGluc3RhbmNlID0ge30sXG4gICAgICAgIGtleXMgPSB0aGlzLmtleXMsXG4gICAgICAgIHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuICAgICAgICBsZW5ndGggPSBrZXlzLmxlbmd0aCxcbiAgICAgICAgaSwgdmFsdWVJbmZvO1xuXG4gICAgZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpe1xuICAgICAgdmFsdWVJbmZvID0gdmFsdWVzW2ldLmNvbm5lY3QoYmluZGluZywgc2NvcGUpO1xuXG4gICAgICBpZih2YWx1ZUluZm8ub2JzZXJ2ZXIpe1xuICAgICAgICBjaGlsZE9ic2VydmVycy5wdXNoKHZhbHVlSW5mby5vYnNlcnZlcik7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlW2tleXNbaV1dID0gdmFsdWVJbmZvLnZhbHVlO1xuICAgIH1cblxuICAgIGlmKGNoaWxkT2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICBvYnNlcnZlciA9IG5ldyBDb21wb3NpdGVPYnNlcnZlcihjaGlsZE9ic2VydmVycywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTppbnN0YW5jZSxcbiAgICAgIG9ic2VydmVyOm9ic2VydmVyXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5wYXJzZXIge1xuICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgfVxuXG4gIHN0YXRpYyB1bnBhcnNlKGV4cHJlc3Npb24pIHtcbiAgICB2YXIgYnVmZmVyID0gW10sXG4gICAgICAgIHZpc2l0b3IgPSBuZXcgVW5wYXJzZXIoYnVmZmVyKTtcblxuICAgIGV4cHJlc3Npb24uYWNjZXB0KHZpc2l0b3IpO1xuXG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKCcnKTtcbiAgfVxuXG4gIHdyaXRlKHRleHQpe1xuICAgIHRoaXMuYnVmZmVyLnB1c2godGV4dCk7XG4gIH1cblxuICB3cml0ZUFyZ3MoYXJncykge1xuICAgIHZhciBpLCBsZW5ndGg7XG5cbiAgICB0aGlzLndyaXRlKCcoJyk7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICB0aGlzLndyaXRlKCcsJyk7XG4gICAgICB9XG5cbiAgICAgIGFyZ3NbaV0uYWNjZXB0KHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMud3JpdGUoJyknKTtcbiAgfVxuXG4gIHZpc2l0Q2hhaW4oY2hhaW4pIHtcbiAgICB2YXIgZXhwcmVzc2lvbnMgPSBjaGFpbi5leHByZXNzaW9ucyxcbiAgICAgICAgbGVuZ3RoID0gZXhwcmVzc2lvbnMubGVuZ3RoLFxuICAgICAgICBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICB0aGlzLndyaXRlKCc7Jyk7XG4gICAgICB9XG5cbiAgICAgIGV4cHJlc3Npb25zW2ldLmFjY2VwdCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICB2aXNpdFZhbHVlQ29udmVydGVyKGNvbnZlcnRlcikge1xuICAgIHZhciBhcmdzID0gY29udmVydGVyLmFyZ3MsXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICBpO1xuXG4gICAgdGhpcy53cml0ZSgnKCcpO1xuICAgIGNvbnZlcnRlci5leHByZXNzaW9uLmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLndyaXRlKGB8JHtjb252ZXJ0ZXIubmFtZX1gKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgdGhpcy53cml0ZSgnIDonKTtcbiAgICAgIGFyZ3NbaV0uYWNjZXB0KHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMud3JpdGUoJyknKTtcbiAgfVxuXG4gIHZpc2l0QXNzaWduKGFzc2lnbikge1xuICAgIGFzc2lnbi50YXJnZXQuYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGUoJz0nKTtcbiAgICBhc3NpZ24udmFsdWUuYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgdmlzaXRDb25kaXRpb25hbChjb25kaXRpb25hbCkge1xuICAgIGNvbmRpdGlvbmFsLmNvbmRpdGlvbi5hY2NlcHQodGhpcyk7XG4gICAgdGhpcy53cml0ZSgnPycpO1xuICAgIGNvbmRpdGlvbmFsLnllcy5hY2NlcHQodGhpcyk7XG4gICAgdGhpcy53cml0ZSgnOicpO1xuICAgIGNvbmRpdGlvbmFsLm5vLmFjY2VwdCh0aGlzKTtcbiAgfVxuXG4gIHZpc2l0QWNjZXNzU2NvcGUoYWNjZXNzKSB7XG4gICAgdGhpcy53cml0ZShhY2Nlc3MubmFtZSk7XG4gIH1cblxuICB2aXNpdEFjY2Vzc01lbWJlcihhY2Nlc3MpIHtcbiAgICBhY2Nlc3Mub2JqZWN0LmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLndyaXRlKGAuJHthY2Nlc3MubmFtZX1gKTtcbiAgfVxuXG4gIHZpc2l0QWNjZXNzS2V5ZWQoYWNjZXNzKSB7XG4gICAgYWNjZXNzLm9iamVjdC5hY2NlcHQodGhpcyk7XG4gICAgdGhpcy53cml0ZSgnWycpO1xuICAgIGFjY2Vzcy5rZXkuYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGUoJ10nKTtcbiAgfVxuXG4gIHZpc2l0Q2FsbFNjb3BlKGNhbGwpIHtcbiAgICB0aGlzLndyaXRlKGNhbGwubmFtZSk7XG4gICAgdGhpcy53cml0ZUFyZ3MoY2FsbC5hcmdzKTtcbiAgfVxuXG4gIHZpc2l0Q2FsbEZ1bmN0aW9uKGNhbGwpIHtcbiAgICBjYWxsLmZ1bmMuYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGVBcmdzKGNhbGwuYXJncyk7XG4gIH1cblxuICB2aXNpdENhbGxNZW1iZXIoY2FsbCkge1xuICAgIGNhbGwub2JqZWN0LmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLndyaXRlKGAuJHtjYWxsLm5hbWV9YCk7XG4gICAgdGhpcy53cml0ZUFyZ3MoY2FsbC5hcmdzKTtcbiAgfVxuXG4gIHZpc2l0UHJlZml4KHByZWZpeCkge1xuICAgIHRoaXMud3JpdGUoYCgke3ByZWZpeC5vcGVyYXRpb259YCk7XG4gICAgcHJlZml4LmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGUoJyknKTtcbiAgfVxuXG4gIHZpc2l0QmluYXJ5KGJpbmFyeSkge1xuICAgIHRoaXMud3JpdGUoJygnKTtcbiAgICBiaW5hcnkubGVmdC5hY2NlcHQodGhpcyk7XG4gICAgdGhpcy53cml0ZShiaW5hcnkub3BlcmF0aW9uKTtcbiAgICBiaW5hcnkucmlnaHQuYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGUoJyknKTtcbiAgfVxuXG4gIHZpc2l0TGl0ZXJhbFByaW1pdGl2ZShsaXRlcmFsKSB7XG4gICAgdGhpcy53cml0ZShgJHtsaXRlcmFsLnZhbHVlfWApO1xuICB9XG5cbiAgdmlzaXRMaXRlcmFsQXJyYXkobGl0ZXJhbCkge1xuICAgIHZhciBlbGVtZW50cyA9IGxpdGVyYWwuZWxlbWVudHMsXG4gICAgICAgIGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgaTtcblxuICAgIHRoaXMud3JpdGUoJ1snKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgdGhpcy53cml0ZSgnLCcpO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50c1tpXS5hY2NlcHQodGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy53cml0ZSgnXScpO1xuICB9XG5cbiAgdmlzaXRMaXRlcmFsT2JqZWN0KGxpdGVyYWwpIHtcbiAgICB2YXIga2V5cyA9IGxpdGVyYWwua2V5cyxcbiAgICAgICAgdmFsdWVzID0gbGl0ZXJhbC52YWx1ZXMsXG4gICAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoLFxuICAgICAgICBpO1xuXG4gICAgdGhpcy53cml0ZSgneycpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaSAhPT0gMCl7XG4gICAgICAgIHRoaXMud3JpdGUoJywnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy53cml0ZShgJyR7a2V5c1tpXX0nOmApO1xuICAgICAgdmFsdWVzW2ldLmFjY2VwdCh0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlKCd9Jyk7XG4gIH1cblxuICB2aXNpdExpdGVyYWxTdHJpbmcobGl0ZXJhbCkge1xuICAgIHZhciBlc2NhcGVkID0gbGl0ZXJhbC52YWx1ZS5yZXBsYWNlKC8nL2csIFwiXFwnXCIpO1xuICAgIHRoaXMud3JpdGUoYCcke2VzY2FwZWR9J2ApO1xuICB9XG59XG5cbnZhciBldmFsTGlzdENhY2hlID0gW1tdLFswXSxbMCwwXSxbMCwwLDBdLFswLDAsMCwwXSxbMCwwLDAsMCwwXV07XG5cbi8vLyBFdmFsdWF0ZSB0aGUgW2xpc3RdIGluIGNvbnRleHQgb2YgdGhlIFtzY29wZV0uXG5mdW5jdGlvbiBldmFsTGlzdChzY29wZSwgbGlzdCwgdmFsdWVDb252ZXJ0ZXJzKSB7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aCxcbiAgICAgIGNhY2hlTGVuZ3RoLCBpO1xuXG4gIGZvciAoY2FjaGVMZW5ndGggPSBldmFsTGlzdENhY2hlLmxlbmd0aDsgY2FjaGVMZW5ndGggPD0gbGVuZ3RoOyArK2NhY2hlTGVuZ3RoKSB7XG4gICAgZXZhbExpc3RDYWNoZS5wdXNoKFtdKTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBldmFsTGlzdENhY2hlW2xlbmd0aF07XG5cbiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgcmVzdWx0W2ldID0gbGlzdFtpXS5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vLyBBZGQgdGhlIHR3byBhcmd1bWVudHMgd2l0aCBhdXRvbWF0aWMgdHlwZSBjb252ZXJzaW9uLlxuZnVuY3Rpb24gYXV0b0NvbnZlcnRBZGQoYSwgYikge1xuICBpZiAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCkge1xuICAgIC8vIFRPRE8oZGVib2VyKTogU3VwcG9ydCBvdGhlcnMuXG4gICAgaWYgKHR5cGVvZiBhID09ICdzdHJpbmcnICYmIHR5cGVvZiBiICE9ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYSArIGIudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGEgIT0gJ3N0cmluZycgJiYgdHlwZW9mIGIgPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBhLnRvU3RyaW5nKCkgKyBiO1xuICAgIH1cblxuICAgIHJldHVybiBhICsgYjtcbiAgfVxuXG4gIGlmIChhICE9IG51bGwpIHtcbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIGlmIChiICE9IG51bGwpIHtcbiAgICByZXR1cm4gYjtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVGdW5jdGlvbkZyb21NYXAob2JqLCBuYW1lKXtcbiAgdmFyIGZ1bmMgPSBvYmpbbmFtZV07XG5cbiAgaWYgKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cblxuICBpZiAoZnVuYyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5kZWZpbmVkIGZ1bmN0aW9uICR7bmFtZX1gKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRLZXllZChvYmosIGtleSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9ialtwYXJzZUludChrZXkpXTtcbiAgfSBlbHNlIGlmIChvYmopIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH0gZWxzZSBpZiAob2JqID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBY2Nlc3NpbmcgbnVsbCBvYmplY3QnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0S2V5ZWQob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICB2YXIgaW5kZXggPSBwYXJzZUludChrZXkpO1xuXG4gICAgaWYgKG9iai5sZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgIG9iai5sZW5ndGggPSBpbmRleCArIDE7XG4gICAgfVxuXG4gICAgb2JqW2luZGV4XSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG4iXX0=